맨위로가기

C 자료형

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

C 자료형은 C 프로그래밍 언어에서 데이터를 표현하는 데 사용되는 자료형을 의미하며, 정수형, 부동소수점형, 부울형, 파생 자료형, 형식 한정자, 고정 폭 정수형 등 다양한 종류가 있다. 정수형은 소수점 이하가 없는 수를 표현하며, `char`, `short`, `int`, `long`, `long long` 등의 키워드를 사용하여 선언하고, 부호 여부를 `signed` 또는 `unsigned`로 지정할 수 있다. 부동소수점형은 실수를 표현하며, `float`, `double`, `long double` 키워드를 사용한다. C99 표준에서는 이식성을 높이기 위해 ``와 ``를 통해 고정 폭 정수형을 제공하며, C23 표준에서는 `bool` 자료형과 비트 단위 정수형을 추가했다.

더 읽어볼만한 페이지

  • C 표준 라이브러리 - 파일 끝
    파일 끝(EOF)은 데이터 소스에서 더 이상 읽을 데이터가 없음을 나타내는 조건이다.
  • C 표준 라이브러리 - Return-to-libc 공격
    Return-to-libc 공격은 버퍼 오버플로우 공격의 한 종류로서, 스택에 임의의 코드를 삽입하는 대신 이미 존재하는 실행 가능한 코드를 재사용하여 NX 비트와 같은 기본적인 버퍼 오버플로우 방지 기술을 우회하는 기법이다.
  • 자료형 - 참조
    참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다.
  • 자료형 - 익명 함수
    익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
C 자료형
기본 정보
이름C
설계자데니스 리치
개발 시기1969년 ~ 1973년
발표 시기1972년
고안자벨 연구소
종류명령형 프로그래밍, 구조적 프로그래밍, 절차적 프로그래밍
영향 받은 언어ALGOL 68, 어셈블리어, BCPL, 포트란
영향을 준 언어C++, C#, 자바, Objective-C, PHP, 펄, 파이썬, 델파이, JavaScript, 리스프, SQL, 비주얼 베이직
자료형
기본 자료형정수형: `char`, `short`, `int`, `long`, `long long`
부동소수점: `float`, `double`, `long double`
파생 자료형포인터
배열
구조체 (`struct`)
공용체 (`union`)
열거형 (`enum`)
제한자`signed`
`unsigned`
`short`
`long`
키워드`auto`
`double`
`int`
`struct`
`break`
`else`
`long`
`switch`
`case`
`enum`
`register`
`typedef`
`char`
`extern`
`return`
`union`
`const`
`float`
`short`
`unsigned`
`continue`
`for`
`signed`
`void`
`default`
`goto`
`sizeof`
`volatile`
`do`
`if`
`static`
`while`
stdint.hC99 표준은 정확한 너비의 정수형을 정의하는 헤더 파일 `stdint.h`를 도입했다.
기타
특징정적 자료형 시스템
컴파일 언어
명령형 프로그래밍
구조적 프로그래밍
절차적 프로그래밍
중간 수준 언어
이식성
메모리 직접 접근 가능
낮은 수준 제어
표준ISO/IEC 9899
파일 확장자`.c`, `.h`

2. 기초 자료형

C 언어의 가장 기본적인 자료형에는 정수형과 부동소수점형이 있다.

2. 1. 정수형

C 언어는 `char`, `int`, `float`, `double`과 같은 기본적인 산술 자료형 지정자와 `signed`, `unsigned`, `short`, `long`과 같은 수정자를 제공한다. 다음 표는 다양한 정수형 자료형의 선언, 설명, 최소 크기(비트), 형식 지정자, 범위, 십진수 상수를 위한 접미사를 보여준다.

자료형설명최소 크기(비트)형식 지정자범위십진수 상수를 위한 접미사
`char`기본 문자 집합을 포함할 수 있는 기계의 가장 작은 주소 지정 가능 단위. 정수 자료형이며, 실제 자료형은 부호 있는 또는 부호 없는 자료형일 수 있다.[7]8%cCHAR_MIN영어, CHAR_MAX영어
`signed char``char`와 동일한 크기이지만 부호가 있는 것으로 보장된다. 최소 -127에서 +127 범위를 포함할 수 있다.[7]8%cSCHAR_MIN영어, SCHAR_MAX영어[5]
`unsigned char``char`와 동일한 크기이지만 부호가 없는 것으로 보장된다. 최소 0에서 255 범위를 포함한다.[6]8%c0, UCHAR_MAX영어
`short`
`short int`
`signed short`
`signed short int`
`Short` 부호 있는 정수 자료형. 최소 -32767에서 +32767 범위를 포함할 수 있다.[7]16%hi 또는 %hdSHRT_MIN영어, SHRT_MAX영어
`unsigned short`
`unsigned short int`
`Short` 부호 없는 정수 자료형. 최소 0에서 65535 범위를 포함한다.[7]16%hu0, USHRT_MAX영어
`int`
`signed`
`signed int`
기본 부호 있는 정수 자료형. 최소 -32767에서 +32767 범위를 포함할 수 있다.[7]16%i 또는 %dINT_MIN영어, INT_MAX영어
`unsigned`
`unsigned int`
기본 부호 없는 정수 자료형. 최소 0에서 65535 범위를 포함한다.[7]16%u0, UINT_MAX영어`u` 또는 `U`[8]
`long`
`long int`
`signed long`
`signed long int`
`Long` 부호 있는 정수 자료형. 최소 -2147483647에서 +2147483647 범위를 포함할 수 있다.[7]32%li 또는 %ldLONG_MIN영어, LONG_MAX영어`l` 또는 `L`[8]
`unsigned long`
`unsigned long int`
`Long` 부호 없는 정수 자료형. 최소 0에서 4294967295 범위를 포함할 수 있다.[7]32%lu0, ULONG_MAX영어`u` 또는 `U` 및 `l` 또는 `L`[8]
`long long`
`long long int`
`signed long long`
`signed long long int`
`Long long` 부호 있는 정수 자료형. 최소 -9223372036854775807에서 +9223372036854775807 범위를 포함할 수 있다.[7] 표준의 C99 버전부터 지정되었다.64%lli 또는 %lldLLONG_MIN영어, LLONG_MAX영어`ll` 또는 `LL`[8]
`unsigned long long`
`unsigned long long int`
`Long long` 부호 없는 정수 자료형. 최소 0에서 18446744073709551615 범위를 포함한다.[7] 표준의 C99 버전부터 지정되었다.64%llu0, ULLONG_MAX영어`u` 또는 `U` 및 `ll` 또는 `LL`[8]



정수 자료형의 실제 크기는 구현에 따라 다르다. 표준은 데이터 형식 간의 크기 관계와 각 데이터 형식의 최소 크기만 요구한다. 크기 관계는 `long long`이 `long`보다 작지 않고, `long`이 `int`보다 작지 않고, `int`가 `short`보다 작지 않아야 한다. `char`의 크기는 항상 최소 지원 데이터 형식이므로 다른 데이터 형식은 더 작을 수 없다.

`char`의 최소 크기는 8비트, `short` 및 `int`의 최소 크기는 16비트, `long`의 경우 32비트이며 `long long`은 최소 64비트를 포함해야 한다.

`int` 자료형은 대상 프로세서가 가장 효율적으로 작업하는 정수 자료형이어야 한다.

2. 1. 1. C 표준 라이브러리의 정수형 상수

limits.h영어는 C 언어의 표준 라이브러리로, 정수형의 범위를 나타내는 상수들을 정의한다.

이름설명최소 크기(더 클 수 있음)
CHAR_BITchar의 비트 수8
SCHAR_MINsigned char의 최솟값-127
SCHAR_MAXsigned char의 최댓값127
UCHAR_MAXunsigned char의 최댓값255
CHAR_MINchar의 최솟값SCHAR_MIN 또는 0
CHAR_MAXchar의 최댓값SCHAR_MAX 또는 UCHAR_MAX
MB_LEN_MAX멀티바이트 문자의 최대 바이트 수1
SHRT_MINshort int의 최솟값-32767
SHRT_MAXshort int의 최댓값32767
USHRT_MAXunsigned short int의 최댓값65535
INT_MINint의 최솟값-2147483648
INT_MAXint의 최댓값2147483647
UINT_MAXunsigned int의 최댓값4294967295
LONG_MINlong int의 최솟값-2147483647
LONG_MAXlong int의 최댓값2147483647
ULONG_MAXunsigned long int의 최댓값4294967295


2. 2. 부동소수점형

부동소수점형은 소수점 이하 부분을 포함하는 실수를 표현하는 자료형이다. `float`, `double`, `long double` 키워드를 사용하여 선언할 수 있다. 각 부동소수점형의 정밀도와 범위는 시스템에 따라 다를 수 있다. `` 헤더 파일 (C++에서는 `cfloat` 헤더)에는 부동소수점형과 관련된 여러 상수 (예: `FLT_MAX`, `DBL_MIN`)가 정의되어 있다.

`float.h` 헤더 파일에는 다음과 같은 상수들이 정의되어 있다.

상수설명
`FLT_MIN`, `DBL_MIN`, `LDBL_MIN`각각 `float`, `double`, `long double`의 최소 정규화 양수 값
`FLT_TRUE_MIN`, `DBL_TRUE_MIN`, `LDBL_TRUE_MIN` (C11)각각 `float`, `double`, `long double`의 최소 양수 값
`FLT_MAX`, `DBL_MAX`, `LDBL_MAX`각각 `float`, `double`, `long double`의 최대 유한 값
`FLT_ROUNDS`부동 소수점 연산의 반올림 모드
`FLT_EVAL_METHOD` (C99)서로 다른 부동 소수점 형식을 포함하는 표현식의 평가 방법
`FLT_RADIX`부동 소수점 형식의 지수 기수
`FLT_DIG`, `DBL_DIG`, `LDBL_DIG`각각 `float`, `double`, `long double`이 정밀도 손실 없이 나타낼 수 있는 십진수 자릿수
`FLT_EPSILON`, `DBL_EPSILON`, `LDBL_EPSILON`각각 `float`, `double`, `long double`의 1.0과 다음 표현 가능한 값의 차이
`FLT_MANT_DIG`, `DBL_MANT_DIG`, `LDBL_MANT_DIG`각각 `float`, `double`, `long double` 형식의 부동 소수점 가수 부분의 `FLT_RADIX` 기수 자릿수
`FLT_MIN_EXP`, `DBL_MIN_EXP`, `LDBL_MIN_EXP``FLT_RADIX`가 이 값보다 1 작은 거듭제곱으로 계산된 값이 정규화된 `float`, `double`, `long double`이 되는 최소 음수 정수
`FLT_MIN_10_EXP`, `DBL_MIN_10_EXP`, `LDBL_MIN_10_EXP`10이 그 거듭제곱으로 계산된 값이 정규화된 `float`, `double`, `long double`이 되는 최소 음수 정수
`FLT_MAX_EXP`, `DBL_MAX_EXP`, `LDBL_MAX_EXP``FLT_RADIX`가 이 값보다 1 작은 거듭제곱으로 계산된 값이 정규화된 `float`, `double`, `long double`이 되는 최대 양수 정수
`FLT_MAX_10_EXP`, `DBL_MAX_10_EXP`, `LDBL_MAX_10_EXP`10이 그 거듭제곱으로 계산된 값이 정규화된 `float`, `double`, `long double`이 되는 최대 양수 정수
`DECIMAL_DIG` (C99)가장 넓게 지원되는 부동 소수점 형식의 모든 숫자를 `DECIMAL_DIG` 자릿수의 십진수로 표현하고, 원래 부동 소수점 형식에서 값을 변경하지 않고 다시 읽을 수 있는 최소 십진수 자릿수. `DECIMAL_DIG`는 최소 10이다.



ISO/IEC TS 18661은 IEEE 754 교환 및 확장 형식에 대한 부동 소수점 형식을 지정한다.


  • `_FloatN`는 바이너리 교환 형식
  • `_DecimalN`는 십진법 교환 형식
  • `_FloatNx`는 바이너리 확장 형식
  • `_DecimalNx`는 십진법 확장 형식

2. 3. 부울형 (Boolean type)

C99는 부울 자료형 `_Bool`을 추가했다. 또한, `` 헤더는 이 자료형에 대한 편리한 별칭으로 `bool`을 정의하고, `true`와 `false`에 대한 매크로도 제공한다. `_Bool`은 일반적인 정수 자료형과 유사하게 작동하지만, 한 가지 예외가 있다. 0(거짓)이 아닌 `_Bool`에 대한 모든 할당은 1(참)로 저장된다. 이러한 동작은 암시적인 축소 변환에서 정수 오버플로우를 피하기 위해 존재한다. 예를 들어, 다음 코드와 같다.

```c

unsigned char b = 256;

if (b) {

/* do something */

}

```

변수 `b`는 `unsigned char`의 크기가 8비트인 경우 거짓으로 평가된다. 이는 값 256이 해당 자료형에 맞지 않아 하위 8비트가 사용되어 0의 결과가 발생하기 때문이다. 그러나 자료형을 `_Bool`로 변경하면 이전 코드가 정상적으로 작동한다.

```c

_Bool b = 256;

if (b) {

/* do something */

}

```

`_Bool` 자료형은 또한 참 값들이 항상 서로 같게 비교되도록 한다.

```c

_Bool a = 1, b = 2;

if (a == b) {

/* this code will run */

}

```

C23에서는 `bool`이 언어의 핵심 기능이 되었다.

```c

bool b = true;

if (b) {

/* this code will run */

}

```

C23에서는 부울 자료형이 `bool`로 이동하여 `` 헤더는 이제 쓸모가 없어졌다.

3. 파생 자료형

파생 자료형은 기초 자료형을 기반으로 만들어지는 자료형으로, 배열, 포인터, 구조체, 공용체, 함수 포인터 등이 있다.


  • 배열: 동일한 자료형의 값들을 메모리에 연속적으로 저장하는 자료 구조이다.
  • 포인터: 변수의 메모리 주소를 저장하는 자료형이다.
  • 구조체: 서로 다른 자료형들을 묶어서 하나의 새로운 자료형으로 만든 것이다.
  • 공용체: 서로 다른 자료형들을 같은 메모리 공간에 저장하는 자료형이다.
  • 함수 포인터: 특정 함수의 주소를 저장하는 포인터이다.

3. 1. 배열 (Arrays)

모든 형식 `T`에 대해, void 및 함수형을 제외하고, '''" `T`형의 `N`개 요소 배열"'''과 같은 형식이 존재한다. 배열은 모두 동일한 유형의 값 모음으로, 메모리에 연속적으로 저장된다. 크기 `N`인 배열은 `0`부터 `''N''−1`까지의 정수로 인덱싱된다. 다음은 간단한 예시이다.

```c

int cat[10]; // 각 int형 요소 10개로 이루어진 배열

```

배열은 복합 초기자를 사용하여 초기화할 수 있지만, 할당할 수는 없다. 배열은 첫 번째 요소에 대한 포인터를 전달하여 함수에 전달된다. 다차원 배열은 '''"배열의 배열 …"'''과 같이 정의되며, 가장 바깥쪽 차원을 제외한 모든 차원은 컴파일 타임 상수 크기를 가져야 한다.[1]

```c

int a[10][8]; // 각 '8개의 int형 요소 배열' 유형의 10개 요소 배열

3. 2. 포인터 (Pointers)

포인터는 특정 타입의 변수가 저장된 위치의 주소를 담는 데이터 타입이다. 포인터는 기본 저장 타입 다음에, 변수 이름 앞에 별표(`*`) 타입 선언자를 사용하여 선언된다. 별표 앞이나 뒤의 공백은 선택 사항이다.

```c

char *square;

long *circle;

int *oval;

```

포인터는 포인터 데이터 타입에 대해서도 선언될 수 있으며, `char ` 및 `int *`와 같이 여러 간접 포인터를 생성할 수 있다. 배열 타입에 대한 포인터도 선언할 수 있는데, 이는 포인터 배열보다 덜 일반적이며 구문이 혼란스러울 수 있다.

```c

char *pc[10]; // 'char에 대한 포인터' 10개 요소의 배열

char (*pa)[10]; // char 10개 요소 배열에 대한 포인터

```

함수 포인터를 사용하면 특정 시그니처를 가진 함수를 참조할 수 있다. 예를 들어, 표준 함수 `abs`의 주소를 변수 `my_int_f`에 저장하려면 다음과 같이 한다.

```c

int (*my_int_f)(int) = &abs;

// & 연산자는 생략할 수 있지만, 여기서 abs의 "주소"가 사용됨을 명확히 한다.

```

함수 포인터는 일반적인 함수 호출과 마찬가지로 이름으로 호출된다. 함수 포인터는 포인터 및 void 포인터와는 별개이다.

3. 3. 구조체 (Structures)

구조체는 서로 다른 데이터 유형을 가질 수 있는 여러 데이터 항목을 하나의 메모리 블록으로 묶어 저장하며, 단일 변수로 참조할 수 있게 한다. 예를 들어, 사람의 이름과 생일을 포함하는 `struct birthday` 데이터 유형을 다음과 같이 선언할 수 있다.

```c

struct birthday {

char name[20];

int day;

int month;

int year;

};

struct birthday John;

```

위 코드에서 `struct birthday` 구조체를 정의한 후 `John`이라는 변수를 선언하여 필요한 저장 공간을 할당했다.

구조체의 메모리 레이아웃은 각 플랫폼의 언어 구현 문제이며, 몇 가지 제약이 따른다. 첫 번째 멤버의 메모리 주소는 구조체 자체의 주소와 같아야 한다. 구조체는 초기화되거나 복합 리터럴을 사용하여 할당될 수 있다. 함수는 구조체를 직접 반환할 수 있지만, 런타임에 종종 효율적이지 않다. C99부터 구조체는 플렉시블 배열 멤버로 끝날 수도 있다.

자신의 유형에 대한 포인터를 포함하는 구조체는 일반적으로 연결된 자료 구조를 구축하는 데 사용된다.

```c

struct node {

int val;

struct node *next;

};

3. 4. 공용체 (Unions)

공용체는 서로 다른 데이터 타입을 같은 메모리 공간에 저장할 수 있게 해주는 특별한 구조체이다. 예를 들어, 하나의 데이터를 정수, 실수 또는 사용자가 정의한 다른 타입으로 읽을 수 있도록 공용체를 선언할 수 있다.

```c

union {

int i;

float f;

struct {

unsigned int u;

double d;

} s;

} u;

```

`u`의 전체 크기는 `u.s`의 크기와 같다. `s`가 `i`와 `f`보다 크기 때문에, `u.s.u`와 `u.s.d` 크기를 합한 것과 같기 때문이다. `u.i`에 값을 할당할 때, `u.i`가 `u.f`보다 작다면 `u.f`의 일부분이 보존될 수 있다.

공용체 멤버에서 값을 읽는 것은 형 변환(캐스팅)과 다르다. 멤버의 값이 변환되는 것이 아니라, 단순히 저장된 값을 그대로 읽는 것이다.

3. 5. 함수 포인터 (Function pointers)

함수 포인터를 사용하면 특정 시그니처를 가진 함수를 참조할 수 있다. 예를 들어, 표준 함수 `abs`의 주소를 변수 `my_int_f`에 저장하려면 다음과 같이 한다.

```c

int (*my_int_f)(int) = &abs;

// & 연산자는 생략할 수 있지만, 여기서 abs의 "주소"가 사용됨을 명확히 한다.

```

함수 포인터는 일반적인 함수 호출과 마찬가지로 이름으로 호출된다. 함수 포인터는 포인터 및 void 포인터와는 별개의 것이다.

4. 형식 한정자 (Type qualifiers)

형식 한정자는 자료형의 속성을 변경하는 데 사용된다. 2014년 기준으로 C11 표준에는 다음 4가지 형식 한정자가 있다.


  • `const` (C89): 값을 변경할 수 없는 상수를 나타낸다.
  • `volatile` (C89): 컴파일러가 특정 변수에 대한 최적화를 수행하지 않도록 한다.
  • `restrict` (C99): 포인터를 통해 접근하는 메모리 영역에 대한 최적화를 지원한다.
  • `_Atomic`/`atomic` (C11): 변수에 대한 접근이 원자적으로 이루어지도록 보장한다.


이 중 `const`는 가장 잘 알려져 있고 가장 많이 사용되며, 표준 라이브러리에서도 나타난다. `const`는 const-정확성을 만족해야 한다.[14] 다른 한정자들은 저수준 프로그래밍에 주로 사용된다.

4. 1. `const`

앞서 언급된 형식은 ''형식 한정자''를 통해 더욱 특징지을 수 있으며, 이는 ''한정된 형식''을 생성한다. 표준 C에는 4가지 형식 한정자가 있다. `const`는 이 중 가장 잘 알려져 있고 가장 많이 사용되며, 표준 라이브러리에 나타나고 C 언어를 사용하면서 자주 접하게 된다. 이는 const-정확성을 만족해야 한다.[14]

4. 2. `volatile`

`volatile` (C89) 한정자는 컴파일러가 최적화를 하지 않도록 지정한다. 이는 하드웨어 레지스터나 다른 스레드에 의해 값이 변경될 수 있는 변수에 사용된다.[14]

4. 3. `restrict` (C99)

`restrict`는 C99에서 추가된 형식 한정자이다. `restrict` 한정자는 포인터가 가리키는 메모리 영역에 대한 접근이 해당 포인터를 통해서만 이루어짐을 나타내며, 컴파일러가 최적화를 수행하는 데 도움을 줄 수 있다.[14]

4. 4. `_Atomic` / `atomic` (C11)

`_Atomic` (또는 `` 헤더 포함 시 `atomic`) 형식 한정자는 변수에 대한 접근이 원자적(atomic)으로 이루어지도록 보장한다.[14] 이는 멀티스레딩 환경에서 데이터 경쟁을 방지하는 데 사용되는 기능으로 C11 표준에서 도입되었다.

5. 고정 폭 정수형 (Fixed-width integer types) (C99)

C99 표준은 프로그램의 이식성을 높이기 위해 `` 및 `` 헤더 파일을 통해 고정 폭 정수형을 제공한다.[2] 기존의 기본 정수형은 실제 크기가 구현에 따라 정의되고 시스템마다 다를 수 있기 때문에 충분하지 않다고 여겨졌다.

새로운 형들은 하드웨어가 일반적으로 몇 가지 형만 지원하고 그 지원이 환경에 따라 다른 임베디드 시스템과 같은 환경에서 특히 유용하다. 모든 새로운 형들은 `<inttypes.h>` 헤더(C++에서는 `<cinttypes>` 헤더)와 `<stdint.h>` 헤더(C++에서는 `<cstdint>` 헤더)에서 사용할 수 있다.

고정 폭 정수형은 다음과 같이 분류할 수 있다.


  • 정확한 너비의 정수형: 모든 구현에서 동일한 비트 수 ''n''을 갖도록 보장된다. 구현에서 사용 가능한 경우에만 포함된다.
  • 최소 너비의 정수형: 지정된 수 ''n'' 이상의 비트를 가지는 가장 작은 정수형이다. 최소 N=8, 16, 32, 64에 대해 지정되도록 보장된다.
  • 가장 빠른 정수형: 지정된 수 ''n'' 이상의 비트를 가지는 가장 빠른 정수형이다. 최소 N=8, 16, 32, 64에 대해 지정되도록 보장된다.
  • 포인터 정수형: 포인터를 저장할 수 있도록 보장된다. 구현에서 사용 가능한 경우에만 포함된다.
  • 최대 너비의 정수형: 구현에서 가장 큰 정수형으로 보장된다.


각 정수형에 대한 자세한 내용은 `stdint.h` 및 `inttypes.h` 하위 섹션을 참고하라.

5. 1. `stdint.h`

C99 표준은 프로그램의 이식성을 높이기 위해 여러 새로운 정수형을 정의한다.[2] 기존 정수형은 실제 크기가 구현에 따라 다를 수 있어 충분하지 않다고 여겨졌다. 새로운 정수형은 임베디드 시스템과 같이 하드웨어가 제한적이고 환경에 따라 지원이 다른 환경에서 특히 유용하다.

새로운 정수형은 `<inttypes.h>` 헤더 (C++에서는 `<cinttypes>` 헤더)와 `<stdint.h>` 헤더 (C++에서는 `<cstdint>` 헤더)에서 사용할 수 있다. 이들은 다음과 같이 분류할 수 있다.

  • 정확한 너비의 정수형: 모든 구현에서 동일한 비트 수 ''n''을 가지도록 보장된다.
  • 최소 너비의 정수형: 지정된 수 ''n'' 이상의 비트를 가지는 가장 작은 정수형이다. N=8, 16, 32, 64에 대해 지정되도록 보장된다.
  • 가장 빠른 정수형: 지정된 수 ''n'' 이상의 비트를 가지는 가장 빠른 정수형이다. N=8, 16, 32, 64에 대해 지정되도록 보장된다.
  • 포인터 정수형: 포인터를 저장할 수 있도록 보장된다.
  • 최대 너비의 정수형: 구현에서 가장 큰 정수형이다.


다음 표는 형과 구현 세부 사항을 얻기 위한 인터페이스를 요약한다(''n''은 비트 수를 나타낸다).

형 범주부호 있는 형부호 없는 형
최소값최대값최소값최대값
정확한 너비`intn_t``INTn_MIN``INTn_MAX``uintn_t`0`UINTn_MAX`
최소 너비`int_leastn_t``INT_LEASTn_MIN``INT_LEASTn_MAX``uint_leastn_t`0`UINT_LEASTn_MAX`
가장 빠름`int_fastn_t``INT_FASTn_MIN``INT_FASTn_MAX``uint_fastn_t`0`UINT_FASTn_MAX`
포인터`intptr_t``INTPTR_MIN``INTPTR_MAX``uintptr_t`0`UINTPTR_MAX`
최대 너비`intmax_t``INTMAX_MIN``INTMAX_MAX``uintmax_t`0`UINTMAX_MAX`


5. 2. `inttypes.h`

`` 헤더 (C++에서는 `cinttypes`)는 `` 헤더에 정의된 자료형의 기능을 향상시키는 기능을 제공한다. 이 헤더는 ``에 정의된 자료형에 해당하는 printf 형식 문자열 및 scanf 형식 문자열 지정자를 위한 매크로와 `intmax_t` 및 `uintmax_t` 자료형을 사용하는 여러 함수를 정의한다. 이 헤더는 C99에서 추가되었다.

매크로는 `PRI''{fmt}{type}''` 형식이다. 여기서 ''{fmt}''는 출력 형식을 정의하며, `d` (10진수), `x` (16진수), `o` (8진수), `u` (부호 없는 정수), `i` (정수) 중 하나이다. ''{type}''은 인수의 유형을 정의하며, `''n''`, `FAST''n''`, `LEAST''n''`, `PTR`, `MAX` 중 하나이며, 여기서 `''n''`은 인수의 비트 수에 해당한다.

`SCN''{fmt}{type}''` 형식의 매크로도 정의되어 있다. 여기서 ''{fmt}''는 출력 형식을 나타내며 `d` (10진수), `x` (16진수), `o` (8진수), `u` (부호 없는 정수), `i` (정수) 중 하나이다. ''{type}''는 인수의 유형을 나타내며 `''n''`, `FAST''n''`, `LEAST''n''`, `PTR`, `MAX` 중 하나이고, `''n''`은 인수의 비트 수를 의미한다.

6. C23 표준 추가 자료형

C23 표준에서는 몇 가지 새로운 자료형이 추가되었다.

6. 1. Bit-precise integer types

C23부터 C 언어는 프로그래머가 임의의 비트 수를 갖는 정수를 정의할 수 있도록 허용한다. 이러한 타입은 _BitInt(N)c로 지정되며, 여기서 ''N''은 부호 있는 타입의 경우 부호 비트를 포함하여 2의 보수로 표현되는 비트 수를 나타내는 정수 상수 표현식이다. ''N''의 최대값은 `BITINT_MAXWIDTH`로 제공되며, 최소 `ULLONG_WIDTH`이다. 따라서 _BitInt(2)c (또는 signed _BitInt(2)c) 타입은 -2에서 1까지의 값을 가지는 반면, unsigned _BitInt(2)c는 0에서 3까지의 값을 가진다. unsigned _BitInt(1)c 타입 또한 존재하며, 0 또는 1이며, 이에 해당하는 부호 있는 타입은 없다.[13]

참조

[1] 웹사이트 Portable Fixed-Width Integers in C https://barrgroup.co[...] 2007-12-02
[2] 서적 ISO/IEC 9899:1999 specification, TC3 https://www.open-std[...]
[3] 서적 Rationale for International Standard—Programming Languages—C Revision 5.10 https://www.open-std[...]
[4] 서적 ISO/IEC 9899:2023 specification draft https://open-std.org[...]
[5] 웹사이트 C and C++ Integer Limits https://docs.microso[...] 2023-07-21
[6] 서적 ISO/IEC 9899:1999 specification, TC3 https://www.open-std[...]
[7] 서적 ISO/IEC 9899:1999 specification, TC3 https://www.open-std[...]
[8] 서적 ISO/IEC 9899:1999 specification, TC3 https://www.open-std[...]
[9] 웹사이트 64-Bit Programming Models: Why LP64? http://www.unix.org/[...] The Open Group 2011-11-09
[10] 웹사이트 Width of Type (The GNU C Library) https://www.gnu.org/[...] 2022-07-30
[11] 웹사이트 https://pubs.opengro[...] 2022-07-30
[12] 서적 ISO/IEC 9899:1999 specification, TC3 https://www.open-std[...]
[13] 서적 ISO/IEC 9899:2023 specification draft https://open-std.org[...]
[14] 간행물 C11:The New C Standard https://www.open-std[...] Thomas Plum



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com